package jvms;

/**
 * @author apple
 * @Classname StringCertificate
 * @Description String在内存中的存在
 * @Date 2020/4/17 11:28
 */
public class StringCertificate {

    public static void main(String[] args) {

        stringTest();
//        stringTest2();
        stringTest3();
//          stringTest4();

    }

    /****/
    public static void stringTest(){
        String a="abc";
        String b="abc";
        /**a,b指向内存常量池中的地址，所以，a==b返回true。a.equals(b)，表示a,b字符串的值，返回true**/
        System.out.println(a.hashCode());
        System.out.println(b.hashCode());
        System.out.println(a==b);
        System.out.println(a.equals(b));
    }

    /****/
    public static void stringTest2(){
        /**a指向内存常量池中的地址，b在内存堆中创建了一个新字符串，指向该字符串的地址**/
        String a="abc";
        String b=new String("abc");
        String c=a;
        /**a指向内存常量池中的地址，b在内存堆中创建了一个新字符串，指向b字符串的地址。
         * 所以a==b，返回false。
         * a.equals(b)，表示a,b字符串的值，返回true**/
        System.out.println(a==c);
        System.out.println(a==b);
        System.out.println(a.equals(b));
    }

    public static void stringTest3(){
        String a="a";
        String b="b";
        String c="c";
        String d=a+b+c;
        String e="abc";
        System.out.println(d==e);
        System.out.println(d.equals(e));
    }

    public static void stringTest4(){
        String a=new String("abc");
        String b=new String("abc");
        /**new String()创建一个新的string对象，在内存中分配地址。a和b的内存地址是不同的
         * 所以 a==b，返回false。
         * a.equals(b),返回true**/
        System.out.println(a==b);
        System.out.println(a.equals(b));
    }
}
